package br.requisiteworks.requisito.modelo.service;

import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.requisiteworks.requisito.modelo.AtributoRequisito;
import br.requisiteworks.requisito.modelo.AtributoTipoRequisito;
import br.requisiteworks.requisito.modelo.dao.AtributoRequisitoDao;
import br.requisiteworks.util.persistencia.ErroBancoDados;
import br.requisiteworks.util.persistencia.ResultadoVazio;

@Service
public class AtributoRequisitoService {

	/**
	 * Log da classe
	 */
	private static final Log log = LogFactory
			.getLog(AtributoRequisitoService.class);

	@Autowired
	private AtributoRequisitoDao atributoDao;

	/**
	 * Salva um novo {@link AtributoRequisito} ao repositorio de dados
	 * 
	 * @param requisito
	 *            o {@link AtributoRequisito} a ser adicionado ao repositorio
	 * @throws ErroBancoDados
	 *             Caso ocorra algum erro durante a persistencia do
	 *             {@link AtributoRequisito}
	 */
	public void salvarAtributo(AtributoRequisito atributo)
			throws ErroBancoDados {
		this.atributoDao.insert(atributo);
		log.info("Atributo de requisito adicionado com sucesso: " + atributo);
	}

	/**
	 * Atualiza um {@link AtributoRequisito} existente no repositorio de dados
	 * 
	 * @param requisito
	 *            o {@link AtributoRequisito} a ser atualizado
	 * @throws ErroBancoDados
	 *             Caso ocorra algum erro durante a persistencia do
	 *             {@link AtributoRequisito}
	 */
	public void atualizarAtributo(AtributoRequisito atributo)
			throws ErroBancoDados {
		this.atributoDao.update(atributo);
		log.info("Atributo de requisito atualizado com sucesso: " + atributo);
	}

	/**
	 * Busca no repositorio por todos os {@link AtributoRequisito}s cadastrados
	 * no sistema
	 * 
	 * @throws ResultadoVazio
	 *             Caso nenhum {@link AtributoRequisito} seja encontrado
	 */
	public List<AtributoRequisito> listarAtributos() throws ResultadoVazio {
		return this.atributoDao.select();
	}

	/**
	 * Busca no repositorio um {@link AtributoRequisito} cujo numero seja igual
	 * ao parametro passado
	 * 
	 * @param numero
	 *            O numero de identificacao do {@link AtributoRequisito} no
	 *            repositorio de dados
	 * @throws ResultadoVazio
	 *             Caso um {@link AtributoRequisito} nao seja encontrado
	 */
	public AtributoRequisito carregarAtributo(int numero) throws ResultadoVazio {
		return this.atributoDao.select(numero);
	}

	/**
	 * Remove do repositorio o {@link AtributoRequisito} passado pelo parametro
	 * 
	 * @param atributo
	 *            O {@link AtributoRequisito} que sera removido do repositorio
	 *            de dados
	 * @throws ErroBancoDados
	 *             Caso ocorra algum erro durante a transacao
	 */
	public void deletaAtributo(AtributoRequisito atributo)
			throws ErroBancoDados {
		this.atributoDao.delete(atributo);
		log.info("Atributo de requisito apagado com sucesso: " + atributo);
	}

	public List<AtributoRequisito> procuraNumero(
			AtributoTipoRequisito atributoTipo) throws ResultadoVazio {
		return this.atributoDao.select(atributoTipo);
	}
}
